package com.vf.admin.utils;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * 文件操作工具类
 */
public class FileTool {
    /**
     * 获取文件后缀名
     * @param fileName
     * @return
     */
    public String getNameHouZhui(String fileName){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
//		String newName = getItemName(20);
        String extendName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        return extendName;
    }

    /**
     * 重命名
     * @param fileName
     * @return
     */
    public String reNameint(String fileName){
        String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
//		String newName = getItemName(20);
        String extendName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        return System.currentTimeMillis()+"_"+new Random().nextInt(100000)+extendName;
    }

    /**
     * 重命名
     * @param
     *         houzhui:文件后缀
     * @return
     */
    public String reNameintAndHouZhui(String houzhui){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
//		String newName = getItemName(20);
        return System.currentTimeMillis()+"_"+new Random().nextInt(100000)+houzhui;
    }

    /**
     * 重命名
     * @param fileName
     * @return
     */
    public String reNameintRandom(String filenewName , String fileName){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
//		String newName = getItemName(20);
        String extendName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        return filenewName+"_"+new Random().nextInt(100000)+extendName;
    }

    /**
     * 重命名
     * @param fileName
     * @return
     */
    public  String reName(String fileName){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
        String newName = getItemName(20);
        String extendName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        return newName + extendName;
    }

    /**
     * 重命名
     * @param
     *        oldFileName 老的文件名
     *        newFileName 新的文件名
     * @return
     */
    public  String reName(String oldFileName,String newFileName){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
        String extendName = oldFileName.substring(oldFileName.lastIndexOf(".")).toLowerCase();
        return newFileName + extendName;
    }

    /**
     * 重命名
     * @param oldFileName
     * @return
     */
    public  String reNameDate(String oldFileName){
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String newName = df.format(new Date());
        String extendName = oldFileName.substring(oldFileName.lastIndexOf(".")).toLowerCase();
        return newName + extendName;
    }

    /**
     * 根据日期生成文件夹名称
     */
    public  String reNameDate(){
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String newName = df.format(new Date());
        return newName;
    }

    /**
     * 根据日期生成文件夹名称
     */
    public  String reNameDateyyMMdd(){
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String newName = df.format(new Date());
        return newName;
    }


    /**
     * 生产ItemName随机函数
     * @param length
     */
    private  String getItemName(int length){
        String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for ( int i = 0; i < length; i++ )
        {
            int number = random.nextInt( base.length() );
            sb.append( base.charAt( number ) );
        }
        return sb.toString();
    }
    /**
     * 复制文件
     * @param file 文件
     * @param filePath 保存地址
     * @throws FileNotFoundException
     * @throws IOException
     */
    public  void upFile(File file, String filePath) throws FileNotFoundException, IOException {
        String dir = filePath.substring(0,filePath.lastIndexOf("/")+1);
        File fd = new File(dir);
        if (!fd.exists()) {// 路径不存在,新建
            fd.mkdirs();
        }

        File f = new File(filePath);
        if (!f.exists()) {// 文件不存在,创建
            f.createNewFile();
        }
        FileOutputStream flashFout = new FileOutputStream(filePath);// 建立上传flash文件流
        FileInputStream flashFin = new FileInputStream(file);// 已上传flash文件建立上传流
        byte[] buffer = new byte[1024]; // 将上传文件的内容写入服务器
        int len = 0;
        while ((len = flashFin.read(buffer)) > 0) {
            flashFout.write(buffer, 0, len);
        }
        flashFout.close();
        flashFin.close();

        //删除老文件
//		if(file!=null){
//			file.delete();
//		}
    }

    /**
     * 复制文件上传
     * @param fileoldpath 老的文件地址
     * @param filePath 新的保存地址文件
     * @throws FileNotFoundException
     * @throws IOException
     */
    public  void upFile(String fileoldpath, String filePath) throws FileNotFoundException, IOException {
        File file = new File(fileoldpath);
        String dir = filePath.substring(0,filePath.lastIndexOf("/")+1);
        File fd = new File(dir);
        if (!fd.exists()) {// 路径不存在,新建
            fd.mkdirs();
        }

        File f = new File(filePath);
        if (!f.exists()) {// 文件不存在,创建
            f.createNewFile();
        }
        FileOutputStream flashFout = new FileOutputStream(filePath);// 建立上传flash文件流
        FileInputStream flashFin = new FileInputStream(file);// 已上传flash文件建立上传流
        byte[] buffer = new byte[1024]; // 将上传文件的内容写入服务器
        int len = 0;
        while ((len = flashFin.read(buffer)) > 0) {
            flashFout.write(buffer, 0, len);
        }
        flashFout.close();
        flashFin.close();

        //删除老文件
//		if(file!=null){
//			file.delete();
//		}
    }

    /**
     * 创建目录
     * @param destDirName 目标目录名
     * @return 目录创建成功返回true，否则返回false
     */
    public  boolean createDir(String destDirName) {
        File dir = new File(destDirName);
        if (dir.exists()) {
//			System.out.println(destDirName +" 目标目录已存在！");
            return true;
        }
        if (!destDirName.endsWith(File.separator))
            destDirName = destDirName + File.separator;
        if (dir.mkdirs()) {   // 创建单个目录
//			System.out.println("创建目录" + destDirName + "成功！");
            return true;
        } else {
//			System.out.println("创建目录" + destDirName + "失败！");
            return false;
        }
    }

    /**
     * 删除单个文件
     * @param   sPath    被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public  boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 往文件写入字符串
     * @param filePath 文件地址
     * @param lineConten 内容
     * @throws IOException
     */
    public  void writeStr(String filePath, String lineConten) throws IOException {
        File file = new File(filePath);
        //文件中是否有写入内容
        if(!validateFile(filePath,lineConten)){
            BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
            bw.write(lineConten);
            bw.newLine();
            bw.flush();
            bw.close();
        }
    }
    /**
     * 验证指定文件是否包含指定的内容
     * @param filePath 文件地址
     * @param lineConten 内容
     * @return 包含内容，返回true
     */
    private  boolean validateFile(String filePath, String lineConten){
        if(lineConten==null||lineConten.equals(""))
            return false;
        File file = new File(filePath);
        BufferedReader reader;
        try {
            if(file.exists()){
                reader = new BufferedReader(new FileReader(file));
                String line;
                while ((line = reader.readLine()) != null) {
                    // 判定条件，本行与原内容匹配，则返回true
                    if (line.startsWith(lineConten)) {
                        return true;
                    }
                }
                reader.close();
            }
        } catch (IOException e) {
//			System.out.println("验证指定文件是否包含指定的内容失败。" + e.getMessage());
            return false;
        }
        return false;
    }

    /**
     * 往文件写入字符串（先清空后写入）
     * @param filePath 文件地址
     * @param lineConten 内容
     * @throws IOException
     */
    public  void writeStr2(String filePath, String lineConten) throws IOException {
        File file = new File(filePath);
        // 删除原有文件的内容
        java.io.RandomAccessFile accfile = new RandomAccessFile(filePath, "rw");
        accfile.setLength(0);
        BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
        bw.write(lineConten);
        bw.newLine();
        bw.flush();
        bw.close();
    }


    /**
     * 读取文件内容（过滤部分字符串）
     * @param path 文件地址
     * @param context 过滤内容
     * @return
     * @throws IOException
     */
    public  String readLineFile(String path,String context) throws IOException {
        StringBuffer sb=new StringBuffer("");
        FileReader fr = new FileReader(path);
        BufferedReader br = new BufferedReader(fr);
        String line = br.readLine();
        while (line != null) {
            if(!context.equals(line))
                sb.append(line);
            line = br.readLine();
        }
        br.close();
        fr.close();
        return sb.toString();
    }

    /** 文件重命名
     * @param oldname 原来的文件名
     * @param newname 新文件名
     */
    public  void renameFile(String oldname,String newname){
        if(!oldname.equals(newname)){//新的文件名和以前文件名不同时,才有必要进行重命名
            File oldfile=new File(oldname);
            File newfile=new File(newname);
            if(newfile.exists()){//若在该目录下已经有一个文件和新文件名相同，则不允许重命名
//	            System.out.println(newname+"已经存在！");
            }else{
                oldfile.renameTo(newfile);
            }
        }
    }

    /**
     * 创建文件
     * @param fileName  文件名称
     * @param filecontent   文件内容
     * @return  是否创建成功，成功则返回true
     */
    public  boolean createFile(String path,String fileName,String filecontent,String kzname){
        Boolean bool = false;
        String filenameTemp = path+fileName+kzname;//文件路径+名称+文件类型
        File file = new File(filenameTemp);

        try {
            //如果文件不存在，则创建新的文件
            if(!file.exists()){
                file.createNewFile();
                bool = true;
                System.out.println("success create file,the file is "+filenameTemp);
                //创建文件成功后，写入内容到文件里
                writeFileContent(filenameTemp, filecontent);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return bool;
    }

    /**
     * 向文件中写入内容
     * @param filepath 文件路径与名称
     * @param newstr  写入的内容
     * @return
     * @throws IOException
     */
    public  boolean writeFileContent(String filepath,String newstr) throws IOException{
        Boolean bool = false;
        String filein = newstr+"\r\n";//新写入的行，换行
        String temp  = "";

        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        FileOutputStream fos  = null;
        PrintWriter pw = null;
        try {
            File file = new File(filepath);//文件路径(包括文件名称)
            //将文件读入输入流
            fis = new FileInputStream(file);
            isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);
            StringBuffer buffer = new StringBuffer();

            //文件原有内容
            for(int i=0;(temp =br.readLine())!=null;i++){
                buffer.append(temp);
                // 行与行之间的分隔符 相当于“\n”
                buffer = buffer.append(System.getProperty("line.separator"));
            }
            buffer.append(filein);

            fos = new FileOutputStream(file);
            pw = new PrintWriter(fos);
            pw.write(buffer.toString().toCharArray());
            pw.flush();
            bool = true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally {
            //不要忘记关闭
            if (pw != null) {
                pw.close();
            }
            if (fos != null) {
                fos.close();
            }
            if (br != null) {
                br.close();
            }
            if (isr != null) {
                isr.close();
            }
            if (fis != null) {
                fis.close();
            }
        }
        return bool;
    }

    /**
     * 向文件中写入内容
     * @param filepath 文件路径与名称
     * @param contentList  写入的内容
     * @return
     * @throws IOException
     */
    public  void writeFileToContent(String filepath, List<String> contentList) throws IOException{
        String dir = filepath.substring(0,filepath.lastIndexOf("/")+1);
        File fd = new File(dir);
        if (!fd.exists()) {// 路径不存在,新建
            fd.mkdirs();
        }

        File fout = new File(filepath);
        FileOutputStream fos = new FileOutputStream(fout);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos,"UTF-8"));
        for (int i = 0; i < contentList.size(); i++) {
            bw.write(contentList.get(i));
            bw.newLine();
        }
        bw.close();
    }

    /**
     * 删除文件
     * @param fileName 文件名称
     * @return
     */
    public  boolean delFile(String path,String fileName,String kzname){
        Boolean bool = false;
        String filenameTemp = path+fileName+kzname;
        File file  = new File(filenameTemp);
        try {
            if(file.exists()){
                file.delete();
                bool = true;
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        return bool;
    }

    /**
     * 重命名
     * @param fileName
     * @return
     */
    public String reNameintAndHouZhui(String fileName,String houzhui){
//		String newName = StringEx.randomString();
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
//		String newName = df.format(new Date()) + new Random().nextInt(1000);
//		String newName = getItemName(20);
        return System.currentTimeMillis()+"_"+new Random().nextInt(1000)+houzhui;
    }
}
